<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>方法的重写覆盖</title>
</head>
<body>
    
</body>
<script>
    class common{
        sum(){
            return this.lesson.reduce((pre,item)=>pre+item.price,0)
        }
        lookfor(value){
            return  this.lesson.filter(item=>item.name.includes(value))
        }
    }
    class les extends common{
        constructor(value){
            super()
            this.lesson = value
        }
        getInfo(){
            return {
                total:super.sum(),
                data:this.lesson
            }
        }
        lookfor(value){
            /*
                先执行父类的lookfor()方法 得到返回值之后执行数组的map方法
                    map方法是会将数组内的每个成员都执行一遍回调函数  并返回会叫函数的内容

                    箭头函数中  当函数体内只有一条语句 那么花括号可以不写 
                        如果一条语句是return语句 那么 return也可以不写
                        如果形参只有一个  那么小括号也可以不写  

                    以上就是箭头函数的一些方便的地方
            */
            return super.lookfor(value).map(item=>item.name)
        }
    }
    let lesson = [
        {name:'Vue.js',price:121},
        {name:'Node.js',price:151},
        {name:'mysql',price:200}
    ]
    let lessons = new les(lesson)
    console.log(lessons.getInfo())  //{total: 472, data: Array(3)}

    // 获取含有指定信息的课程
    console.log(lessons.lookfor('js'))   //["Vue.js", "Node.js"]

    /*
        这里的执行逻辑是如下：
            因为父类和字类中都含有lookfor这个方法  所以类会选择执行子类中的方法，
            因为子类中又执行父类的方法 所以会去自行父类中的方法 在返回给子类继续下面的操作
    */

</script>
</html>